<?php
/*
 * 适配器模式的使用场景：
 * 1.同一种或者同一类功能的外部实现接口不一致时，使用适配器使这些外部接口进行接口统一，方便系统调用。
 */

namespace App\DesignPattern\Adapter;
/**
 * 适配器的使用场景：
 * 1.多个相同功能的不同实现方式可能原先的对象方法不同，这样在替换类时就很变得非常麻烦，如果使用适配器，将方法进行统一，各实现方式进行方法名限制，则可以轻松替换类实现。
 */
interface DbAdapter {
	/**
	 * 构造
	 * @param string $host 服务器地址，必填
	 * @param string $user 用户名，必填
	 * @param string $pwd 用户密码，必填
	 * @param string $dbname 数据库名，必填
	 * @param int $port 端口号，选填，MySQL默认是3306
	 * @param string $charset 指定编码，选填，默认utf8
	 * @param array $opts 连接的其他选项，选填
	 */
	public function __construct($host, $user, $pwd, $dbname, $port = null, $charset = "utf8", array $opts = null);
	
	/**
	 * 统一需要显式实现析构函数
	 */
	public function __destruct();
	
	/**
	 * 返回当前使用的数据库对象原型，用于原生操作
	 */
	public function prototype();
	
	/**
	 * 执行一个SQL语句并返回相应结果
	 * @param string $sql SQL语句，支持原生的pdo问号预处理
	 * @param array $params 可选的绑定参数
	 * @param callable $callback 如果定义该记录集回调函数则不返回数组而直接进行循环回调
	 * @return mixed SELECT语句返回数组或不返回，INSERT/REPLACE返回自增ID，其余返回受影响行数。如果设置为只返回SQL语句则不执行该SQL语句
	 */
	public function query($sql, array $params = [], callable $callback = null);
}